ComfyUI で使える高速化・VRAM 技術
ComfyUI は PyTorch attention = FlashAttention がデフォルトで使われるので、それは記載していない。昔は xformers(中身は FlashAttention)も使われていたが、最近では PyTorch attention を使うことが多い。
ComfyUI のオプションは comfy/cli_args.py を見るのが早い。
目次
ComfyUI のメモリ管理
モデルを VRAM に移動しても RAM 上のモデルは解放されないことに注意。
ComfyUI のデフォルト挙動
- ワークフロー上にあっても、ノードが実行されない限り RAM にモデルがロードされることはない
- ノード実行時モデルを VRAM にロードし実行する
- 実行後モデルを RAM に退避する(highvram オプションはこれを無効にする)
- ワークフロー実行中に、RAM にロードされたモデルをアンロードする方法はない(たぶん)
ComfyUI はワークフローで使うモデルをすべて RAM にロードし、実行中はアンロードできない。Wan 2.2 を fp16 で実行する場合、最低 68.4 GB の RAM が必要になる。
| モデル | サイズ(GB) |
|---|---|
| umt5_xxl_fp8 | 9.0 |
| wan2.2_vae | 1.4 |
| high-fp16 | 29.0 |
| low-fp16 | 29.0 |
モデルと VRAM
画像生成モデルの場合、モデルサイズ ≒ VRAM 使用量だが、動画生成モデルでは違う。
動画生成モデルは生成途中の動画データも数 GB の VRAM を使用するので、モデルサイズだけで VRAM が足りるかどうかを判定できない。
RTX 5090 は VRAM 32 GB で Wan 2.2 fp16 は 29 GB なので、モデルがすべて VRAM に乗ると考えがちだが、生成動画分の VRAM と OS 管理分とが必要なので足りない。
VRAM
GGUF
GGUF はモデル量子化技術。VRAM にモデルが乗らなくても RAM にブロックを退避して実行可能。
Block Swap
モデルの一部を RAM に退避して実行できる。
ComfyUI-MultiGPU DisTorch 2.0
複数 GPU の VRAM と RAM とに好きなようにブロックを割り付けできる
pinned-memory
RAM に確保したモデルがページングされなくなる。ページングとは RAM も VRAM も不足した場合、OS が SSD や HDD を使って処理を継続する機能。pinned-memory はこれを無効化する。
つまり pinned-memory が有効な状態で RAM も VRAM も不足すると OOM が発生する。
pinned-memory を無効にするには --disable-pinned-memory オプションをつけて ComfyUI を起動する。
python main.py --disable-pinned-memory
reserve-vram
OS が利用する VRAM 量を指定する。Kijai は --reserve-varm 2 を指定することを推奨している。
最新の ComfyUI は自動で VRAM と RAM とにモデルを割り振る。しかし、OS が VRAM を使用して VRAM が不足すると共有 VRAM が使用され、生成速度が劇的に低下する。reserve-vram はこれを回避できる。
当然 ComfyUI が使用できる VRAM 量が減少するため生成速度は低下する可能性が高い。
python main.py --reserve-varm 2
highvram
ComfyUI はノード実行後、モデルを RAM へ退避する。highvram を指定するとモデルを RAM へ退避しなくなる。
python main.py --highvram
量子化
量子化はモデルの表現ビット数を減らしてモデルサイズを減らす。VRAM 速度がボトルネックの場合は推論速度も上がる。LLM では量子化で推論速度も上がるが、画像・動画生成 AI では推論速度は上がらない傾向にある。
| 手法 | 説明 |
|---|---|
| GGUF | 拡張子が GGUF のモデル。VRAM にモデルが乗らなくても RAM にブロックを退避して実行可能 |
| fp8 | RTX 4000 番台以降ではハードウェアで高速に実行できる |
| SVDQuant | モデルを外れ値とそうでない部分とに分けて量子化する手法。nuncyaku という名前で呼ばれている |
| TensorRT | 量子化+生成解像度指定等の最適化で効率的に実行できるようにモデルを変換して高速化する |
8 bit 量子化比較
fp8 はRTX 4000 番台以降での評価。fp8_scaled は高品質かつ高速なのでベストな選択。
- 品質:Q8_0 > fp8_scaled >> fp8
- 速度:fp8_scaled = fp8 >> Q8_0
| 手法 | 品質 | 推論速度 |
|---|---|---|
| Q8_0 | fp16 に匹敵 | 遅い |
| fp8_scaled | Q8_0 に匹敵 | 速い |
| fp8 | Q5_K_M や Q6_K_M 相当 | 速い |
蒸留
モデルファイル名に 4step や 8step が入っていると蒸留モデルの可能性が高い。最近は LoRA 形式で配布されることが多い。
torch.compile
モデルをネイティブコードに変換して高速化する。SageAttention と同時に使われることが多い。
triton
モデルのコードをカスタム GPU カーネルに変換するライブラリ。SageAttention と同時に使われることが多い。
Windows 用バイナリも増えてきて簡単にインストールできるようになった。
pip install -U 'triton-windows<3.3'
SageAttention
アテンションの計算に SageAttention を使うことで高速化する。SDXL は U-Net を使用しており、アテンションはプロンプトの取り込み部分にしか使われていないので、SDXL は SageAttention を使ってもほとんど高速化しない。
SDXL 以降の画像生成・動画生成 AI は拡散トランスフォーマーなので SageAttention で高速化できる。
TeaCache
「モデルに入力するノイズ画像 - デノイズ後の画像」の差分ベクトルはステップ中盤以降はほとんど変化しないことが多い。なのでこの差分ベクトルをキャッシュして使いまわしてデノイズすることで、推論を丸ごとスキップして高速化する。